package com.hong.utils.executors;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @Auther: Administrator
 * @Date: 2018/7/29 17:47
 * @Description:
 */
public class ScheduledExecutorServiceExample1 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 创建一个2位核数的定时任务
         */
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
        /**
         *callable - 执行的功能
         * delay - 从现在开始延迟执行的时间
         * unit - 延迟参数的时间单位
         * 延迟15秒打印出来
         */
        ScheduledFuture<?> future =executor.schedule(()-> System.out.println("==i will be invoked!"),15,TimeUnit.SECONDS);
        /**
         *取消任务
         */
        System.out.println(future.cancel(true));
        /**
         * callable - 执行的功能
         *          * delay - 从现在开始延迟执行的时间
         *          * unit - 延迟参数的时间单位
         */
        ScheduledFuture<Integer> schedule = executor.schedule(() -> 2, 2, TimeUnit.SECONDS);
        /**
         * 阻塞住直到获取结果
         */
        System.out.println(schedule.get());
        /**
         * 创建并执行在给定的初始延迟之后，随后以给定的时间段首先启用的周期性动作; 那就是执行将在initialDelay之后开始，然后initialDelay+period ，然后是initialDelay + 2 * period ，等等。 如果任务的执行遇到异常，则后续的执行被抑制。 否则，任务将仅通过取消或终止执行人终止。 如果任务执行时间比其周期长，则后续执行可能会迟到，但不会同时执行。
         */
        executor.scheduleAtFixedRate(()-> System.out.println("i am running"),1,2,TimeUnit.SECONDS);

        /**
         * 测试定时器是每隔5秒跑一次
         */
        final AtomicLong interval = new AtomicLong(0L);
        ScheduledFuture<?> futures= executor.scheduleAtFixedRate(()->{
            long currentTimeMillis =    System.currentTimeMillis();
            if(interval.get() == 0){
                System.out.printf("The first time trigger task at %d\n",currentTimeMillis);
            }else{
                System.out.printf("The actually spend [%d]\n",currentTimeMillis-interval.get());
            }
            interval.set(currentTimeMillis);
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        },1,2,TimeUnit.SECONDS);
    }
}
